home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1992 / 09 / 2 / window-machine / wm_source.ampk / WM_Image.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  9.2 KB  |  481 lines

  1. #include <WM.h>
  2. #include <MyStructs.h>
  3. #include <Image.h>
  4.  
  5. extern SHORT gheight,gwidth;
  6.  
  7. USHORT ReadIFF(UBYTE mod,UBYTE Imod,UBYTE *string)
  8. {
  9.     UBYTE *wohin,*woher;
  10.     USHORT ERR,BMHDFlag;
  11.     if(suffix==1)
  12.     {
  13.         suffix=0;
  14.         Change=0;
  15.     }
  16.     ERR=FileRequester(string,94);
  17.     Datei=NULL;
  18.     zeiger=NULL;
  19.     ScreenToFront(WMsc);
  20.     if(ERR == 1) return(1);
  21.     if(ERR==2) return(4);
  22.     Gwin=IntuitionBase->ActiveWindow;
  23.     SetPointer(Gwin,Wecker,20,15,0,0);
  24.     if(!(Datei=Open(FileName,MODE_OLDFILE))) return(3);
  25.     write=Seek(Datei,NULL,OFFSET_END);
  26.     if(write==-1) return(3);
  27.     write=Seek(Datei,NULL,OFFSET_BEGINNING);
  28.     if(write==-1) return(3);
  29.     write-=12;
  30.     CMAPFlag=FALSE;
  31.     CAMGFlag=FALSE;
  32.     BODYFlag=FALSE;
  33.     BMHDFlag=FALSE;
  34.     if(!(zeiger=(UBYTE*)AllocMem(write+1,MEMF_CLEAR|MEMF_PUBLIC)))
  35.         return(1);
  36.  
  37. /* auf 'FORM' testen */
  38.  
  39.     if(!(read=Read(Datei,Buffer,8))) return(3);    /* DISK-ERROR */
  40.     if(strncmp(Buffer,"FORM",4)) return(2);    /* kein IFF */
  41.  
  42. /* auf 'ILBM' testen */
  43.  
  44.     if(!(read=Read(Datei,Buffer,4))) return(3); /* DISK-ERROR */
  45.     if(strncmp(Buffer,"ILBM",4)) return(2);    /* kein ILBM */
  46.  
  47. /* Daten einlesen und Werte retten */
  48.  
  49.     if(!(read=Read(Datei,zeiger,write))) return(3);
  50.     Close(Datei);
  51.     Datei=NULL;
  52.     woher=zeiger;
  53.     Planes=(woher+read);
  54.  
  55. /* weitere Chunks überlesen, bis 'CMAP ', 'CAMG' oder 'BODY'-Chunk kommt */
  56.  
  57.     ok=TRUE;
  58.     while(ok)
  59.     {
  60.         if(strncmp(woher,"BMHD",4)==0)
  61.         {
  62.             wohin=(UBYTE*)&BMHD;
  63.             woher+=8;
  64.             for(i=0; i<20; i++)
  65.                 *(wohin++)=*woher++;
  66.             BMHDFlag=TRUE;
  67.         }
  68.         else if(strncmp(woher,"CMAP",4)==0)
  69.         {
  70.             woher+=8;
  71.             BType=*(woher-1);
  72.             wohin=(UBYTE *)&CMAPColors;
  73.             for(i=0; i<BType; i++)
  74.                 *(wohin++)=*woher++;
  75.             CMAPFlag=TRUE;
  76.         }
  77.         else if(strncmp(woher,"CAMG",4)==0)
  78.         {
  79.             woher+=8;
  80.             wohin=(UBYTE *)&CAMG;
  81.             for(i=0; i<4; i++)
  82.                 *(wohin++)=*woher++;
  83.             CAMGFlag=TRUE;
  84.         }
  85.         else if(strncmp(woher,"BODY",4)==0)
  86.         {
  87.             woher+=8;
  88.             ok=FALSE;
  89.             BODYFlag=TRUE;
  90.         }
  91.         else
  92.         {
  93.             if(woher != Planes) woher++;
  94.             else ok=FALSE;
  95.         }
  96.     }
  97.  
  98.     if(!BMHDFlag)
  99.     {
  100.         Ready1();
  101.         Error(31,0,1);
  102.         return(0);
  103.     }
  104. /* BODY-Chunk nicht gefunden */
  105.  
  106.     if(!BODYFlag)
  107.     {
  108.         Ready1();
  109.         Error(26,0,1);
  110.         return(0);
  111.     }
  112.  
  113. /* Leseroutine abbrechen wenn nur CMAP-Chunk gebraucht wird */
  114.  
  115.     if(mod)
  116.     {
  117.         Ready1();
  118.         return(0);
  119.     }
  120.  
  121. /* Speicher für Grafik reservieren */
  122.  
  123.     Iffx=((BMHD.Width+15) >> 4) << 1;    /* Bytes pro Reihe */
  124.     IffPSize=Iffx * BMHD.Height;    /* Größe je Plane */
  125.     IffSize=IffPSize*BMHD.BitPlanes; /* Gesamtgröße der Grafik */
  126.     if(!(helpI=(struct MyImage *)AllocMem(sizeof(struct MyImage),
  127.         MEMF_CLEAR|MEMF_PUBLIC)))
  128.         return(3);
  129.     if(!(helpI->ImageData=(USHORT*)AllocMem(IffSize+10,
  130.         MEMF_CLEAR|MEMF_CHIP)))
  131.     {
  132.         FreeMem(helpI,sizeof(struct MyImage));
  133.         return(3);        /* nicht genug Speicher */
  134.     }
  135.  
  136. /* Grafik einlesen */
  137.  
  138.     depth=BMHD.BitPlanes;
  139.     if(BMHD.Masking & 1) depth++;
  140.     for(y=0; y < BMHD.Height; y++)
  141.     {
  142.         Iffy=y*Iffx;
  143.         for(Iffb=0; Iffb < depth; Iffb++)
  144.         {
  145.             size=0;
  146.             wert=0;
  147.             Iff=Iffb*IffPSize;
  148.             if(Iffb < BMHD.BitPlanes)
  149.             {
  150.                 wert=1;
  151.                 wohin=(UBYTE*)helpI->ImageData+Iff+Iffy;
  152.             }
  153.             if(BMHD.Compression == 0)
  154.             {
  155.                 while(size++ < Iffx)
  156.                 {
  157.                     if(wert) *wohin++ = *woher;
  158.                     woher++;
  159.                 }
  160.             }
  161.             if(BMHD.Compression == 1)
  162.             {
  163.                 while(size < Iffx)
  164.                 {
  165.                     CodeSize=*woher++;
  166.                     if(CodeSize < 128)
  167.                     {
  168.                         for(i=0; i<CodeSize+1; i++)
  169.                         {
  170.                             if(wert)
  171.                             *wohin++ = *woher;
  172.                             woher++;
  173.                             size++;
  174.                         }
  175.                     }
  176.                     if(CodeSize > 128)
  177.                     {
  178.                         BType=*woher++;
  179.                         for(i=0; i<257-CodeSize; i++)
  180.                         {
  181.                             if(wert)
  182.                             *wohin++ = BType;
  183.                             size++;
  184.                         }
  185.                     }
  186.                 }
  187.             }
  188.         }
  189.     }
  190.     FreeMem(zeiger,write+1);
  191.     zeiger=NULL;
  192.     helpI->Width=BMHD.Width;
  193.     helpI->Height=BMHD.Height;
  194.     helpI->Depth=BMHD.BitPlanes;
  195.     if(helpI->Depth > sc->BitMap.Depth)
  196.         helpI->Depth = sc->BitMap.Depth;
  197.     helpI->PlanePick=PWert[helpI->Depth-1];
  198.     helpI->Size=IffSize;
  199.     switch(Imod)
  200.     {
  201.         case 0: if((agad->GadgetType & 3)==3) agad->PropImage=helpI;
  202.             else agad->GadgetImage=helpI;
  203.             agad->Image=1;
  204.             break;
  205.         case 1: if((agad->GadgetType & 3)==3) agad->PSImage=helpI;
  206.             else agad->SelectImage=helpI;
  207.             agad->Image=1;
  208.             break;
  209.         case 2: aitem->ItemImage=helpI;
  210.             break;
  211.         case 3: aitem->SelectImage=helpI;
  212.             break;
  213.         case 4: asub->ItemImage=helpI;
  214.             break;
  215.         case 5: asub->SelectImage=helpI;
  216.             break;
  217.         case 6: awin->CheckMark=helpI;
  218.             break;
  219.         case 7: areq->ReqImage=helpI;
  220.             break;
  221.     }
  222.     MakeImage();
  223.     Ready1();
  224.     return(0);
  225. }
  226. VOID Ready1()
  227. {
  228.     ClearPointer(Gwin);
  229. }
  230. VOID SetIMDefines(UBYTE Imode)
  231. {
  232.     status=0;
  233.     helpI=NULL;
  234.     ILoad.Flags=NULL;
  235.     switch(Imode)
  236.     {
  237.         case 0: if((agad->GadgetType & 3)==3) helpI=agad->PropImage;
  238.             else helpI=agad->GadgetImage;
  239.             break;
  240.         case 1: if((agad->GadgetType & 3)==3) helpI=agad->PSImage;
  241.             else helpI=agad->SelectImage;
  242.             break;
  243.         case 2: helpI=aitem->ItemImage;
  244.             break;
  245.         case 3: helpI=aitem->SelectImage;
  246.             break;
  247.         case 4: helpI=asub->ItemImage;
  248.             break;
  249.         case 5: helpI=asub->SelectImage;
  250.             break;
  251.         case 6: helpI=awin->CheckMark;
  252.             break;
  253.         case 7: helpI=areq->ReqImage;
  254.             break;
  255.     }
  256.     if(helpI != NULL)
  257.     {
  258.         left=helpI->LeftEdge;
  259.         top=helpI->TopEdge;
  260.         Ipick=helpI->PlanePick;
  261.         Ionoff=helpI->PlaneOnOff;
  262.         if(helpI->Size) ILoad.Flags=GADGDISABLED;
  263.         status=1;
  264.     }
  265.     if(Imode==0 && (agad->GadgetType & 3)==1 && helpI==NULL)
  266.     {
  267.         helpI=(struct MyImage *)AllocMem(sizeof(struct MyImage),
  268.             MEMF_CLEAR|MEMF_PUBLIC);
  269.         helpI->LeftEdge=0;
  270.         helpI->TopEdge=0;
  271.         helpI->Width=agad->Width;
  272.         helpI->Height=agad->Height;
  273.         helpI->Depth=0;
  274.         helpI->ImageData=NULL;
  275.         helpI->PlanePick=Ipick;
  276.         helpI->PlaneOnOff=Ionoff;
  277.         helpI->Size=0;
  278.         agad->GadgetImage=helpI;
  279.         agad->Image=1;
  280.         status=0;
  281.     }
  282.     if(helpI==NULL)
  283.     {
  284.         left=0;
  285.         top=0;
  286.         Ipick=PWert[sc->RastPort.BitMap->Depth-1];
  287.         Ionoff=0;
  288.     }
  289.     sprintf(LEFTBuff,"%d",left);
  290.     sprintf(TOPBuff,"%d",top);
  291.     j=1;
  292.     for(i=5; i>0; i--)
  293.     {
  294.         Pick[i].Flags=NULL;
  295.         OnOff[i].Flags=NULL;
  296.         if(Ipick & j) Pick[i].Flags=SELECTED;
  297.         if(Ionoff & j) OnOff[i].Flags=SELECTED;
  298.         j = j << 1;
  299.     }
  300. }
  301. USHORT DefImage(UBYTE ImageMode)
  302. {
  303.     USHORT OKI=1;
  304.     ScreenToFront(WMsc);
  305.     SetIMDefines(ImageMode);
  306.     IMWindow.Screen=WMsc;
  307.     if(IMW())
  308.     {
  309.         Error(0,1,1);
  310.         return(1);
  311.     }
  312.     do
  313.     {
  314.         Wait(1L << Iwin->UserPort->mp_SigBit);
  315.         GetMessage(Iwin);
  316.         switch(class)
  317.         {
  318.             case GADGETUP:
  319.             switch(Id)
  320.             {
  321.                 /* ENDE */
  322.                 case 0: OKI=0;
  323.                     if(helpI != NULL && status==0)
  324.                         DelImage(ImageMode);
  325.                     break;
  326.                 /* O K */
  327.                 case 1: if(helpI != NULL)
  328.                     {
  329.                         helpI->LeftEdge=left;
  330.                         helpI->TopEdge=top;
  331.                         helpI->PlanePick=Ipick;
  332.                         helpI->PlaneOnOff=Ionoff;
  333.                         SaveOk=1;
  334.                     }
  335.                     OKI=2;
  336.                     break;
  337.                 /* LÖSCHEN */
  338.                 case 2: if(helpI != NULL)
  339.                     {
  340.                         if(Error(35,0,0)==0) break;
  341.                         DelImage(ImageMode);
  342.                         if(ImageMode < 2 && (agad->GadgetType & 3) != 3)
  343.                         {
  344.                             if(agad->GadgetImage==NULL && agad->SelectImage==NULL)
  345.                             {
  346.                                 agad->Image=0;
  347.                                 if(agad->GadgetBorder) agad->Border=1;
  348.                             }
  349.                         }
  350.                         OKI=2;
  351.                     }
  352.                     else Error(14,0,0);
  353.                     break;
  354.                 /* Image laden */
  355.                 case 3: if(helpI != NULL) DelImage(ImageMode);
  356.                     CloseWindow(Iwin);
  357.                     err=ReadIFF(0,ImageMode,"IFF-Datei laden !");
  358.                     if(Datei) Close(Datei);
  359.                     if(zeiger) FreeMem(zeiger,write+1);
  360.                     if(err>1 && err < 4) Ready1();
  361.                     if(err==3) Error(1,0,1);
  362.                     if(err==2) Error(27,0,1);
  363.                     if(err==1) Error(0,0,1);
  364.                     if(err==0) SetIMDefines(ImageMode);
  365.                     IMW();
  366.                     break;
  367.                 /* Image anpassen */
  368.                 case 4: if(helpI != NULL) {
  369.                 switch(ImageMode)
  370.                 {
  371.                     case 0:
  372.                     case 1:    gheight=helpI->Height;
  373.                         gwidth=helpI->Width;
  374.                         BType=0;
  375.                         abor=agad->GadgetBorder;
  376.                         TestBorder();
  377.                         BType=1;
  378.                         abor=agad->SelectBorder;
  379.                         TestBorder();
  380.                         agad->Width=helpI->Width;
  381.                         if(agad->Flags & GRELWIDTH)
  382.                             agad->Width-=awin->Width;
  383.                         agad->Height=helpI->Height;
  384.                         if(agad->Flags & GRELHEIGHT)
  385.                             agad->Height-=awin->Height;
  386.                         break;
  387.                     case 2:
  388.                     case 3:
  389.                     case 4:
  390.                     case 5: RetteItem(0);
  391.                         NewImagePos();
  392.                         break;
  393.                     case 6: break;
  394.                     case 7: awin->Width=helpI->Width;
  395.                         awin->Height=helpI->Height;
  396.                         Mwidth=helpI->Width;
  397.                         Mheight=helpI->Height;
  398.                         BType=2;
  399.                         abor=areq->ReqBorder;
  400.                         TestBorder();
  401.                         break;
  402.                 } }
  403.                 break;
  404.                 /* TopEdge */
  405.                 case 5: top=TOPInfo.LongInt;
  406.                     break;
  407.                 /* LeftEdge */
  408.                 case 6: left=LEFTInfo.LongInt;
  409.                     break;
  410.                 case 7:
  411.                 case 8:
  412.                 case 9:
  413.                 case 10:
  414.                 case 11:
  415.                 case 12: j=32 >> (Id-7);
  416.                     Ipick ^= j;
  417.                     break;
  418.                 case 13:
  419.                 case 14:
  420.                 case 15:
  421.                 case 16:
  422.                 case 17:
  423.                 case 18: j=32 >> (Id-13);
  424.                     Ionoff ^= j;
  425.                     break;
  426.                 default: break;
  427.             } /* switch Id */
  428.             break;
  429.         } /* switch class */            
  430.     } while(OKI==1); /* do */
  431.     CloseWindow(Iwin);
  432.     Work();
  433.     ScreenToFront(sc);
  434.     if(OKI==2)
  435.     {
  436.         if(ImageMode < 2 || ImageMode > 6)
  437.             SetNewWin(1);
  438.     }
  439.     Ready();
  440.     return(0);
  441. }
  442. USHORT IMW()
  443. {
  444.     if(!(Iwin=(struct Window *)OpenWindow(&IMWindow))) return(1);
  445.     Irp=Iwin->RPort;
  446.     WinBorder(Iwin);
  447.     return(0);
  448. }
  449. VOID NewImagePos()
  450. {
  451.     left=helpI->LeftEdge;
  452.     top=helpI->TopEdge;
  453.     sprintf(LEFTBuff,"%d",left);
  454.     sprintf(TOPBuff,"%d",top);
  455.     RefreshGList(&IMLeft,Iwin,NULL,2);
  456. }
  457. VOID CheckItem()
  458. {
  459.     helpM=awin->MenuStrip;
  460.     while(helpM)
  461.     {
  462.         aitem=helpM->FirstItem;
  463.         while(aitem)
  464.         {
  465.             MType=1;
  466.             if(aitem->Auto) ItemAuto();
  467.             asub=aitem->Sub;
  468.             MType=2;
  469.             while(asub)
  470.             {
  471.                 if(asub->Auto) ItemAuto();
  472.                 asub=asub->Next;
  473.             }
  474.             aitem=aitem->Next;
  475.         }
  476.         helpM=helpM->Next;
  477.     }
  478. }
  479.  
  480.  
  481.